package database

import (
	"database/sql"
	"fmt"
	"log"
	"src/utils"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
)

// 初始化数据库

var sqlDB *sql.DB // 全局变量
func InitDatabase() *gorm.DB {
	//数据库配置
	conf, err := utils.ReadYamlConfig("conf.yml")
	if err != nil {
		panic(err)
	}
	//连接数据库
	username := conf.Database.Username
	password := conf.Database.Password
	host := conf.Database.Host
	port := conf.Database.Port
	database := conf.Database.Database
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, database)
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		NamingStrategy:         schema.NamingStrategy{SingularTable: true},
		SkipDefaultTransaction: true,
	})
	if err != nil {
		panic(fmt.Sprintf("failed to connect database %s", err))
	}
	//if err != nil {
	//	panic(fmt.Sprintf("failed to connect database %s", err))
	//} else {
	//	return db
	//}
	// 获取底层 *sql.DB 对象
	sqlDB, err = db.DB() // 赋值给全局变量
	if err != nil {
		log.Fatalf("failed to get sql.DB: %v", err)
	}
	// SetMaxIdleConns 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(100)
	// SetMaxOpenConns 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(50)
	// SetConnMaxLifetime 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Hour)
	return db
}

func GetSqlDB() *sql.DB {
	if sqlDB == nil {
		log.Fatalf("sqlDB is not initialized")
	}
	return sqlDB
}

// Close 关闭数据库连接
func Close() {
	if sqlDB == nil {
		log.Println("sqlDB is nil, nothing to close.")
		return
	}
	if err := sqlDB.Close(); err != nil {
		log.Fatalf("failed to close database: %v", err)
	}
	log.Println("Database connection closed successfully.")
}
